As computer performance demands increase, multiprocessor computer systems are becoming more popular. Some popular multiprocessor architectures include nodes, which include multiple central processing units (CPUs) and multiple physical memory units. For software executing on such a multiprocessor system, the multiple physical memory units appear as one large physical memory address space. When memory is distributed over a number of nodes, system performance can vary because software processes can be assigned memory addresses on different nodes. Typically, CPUs can access local memory locations much faster than remote memory locations. Therefore, to increase system performance, it is often preferable to allocate local memory to software running on a local CPU. However, allocating remote memory may be preferable when there is not sufficient local memory available for executing high-priority software processes.
Some prior art multiprocessor systems provide highly flexible memory allocation schemes that allow certain physical memory segments to be allocated to specific nodes (or processors), while allowing other physical memory segments to be allocated to any node (or processor). These highly flexible memory allocation schemes often do not abstract memory allocation details from software designers, making software design relatively complicated. Moreover, these highly flexible memory systems often require software to be redesigned when nodes are added or removed from the multiprocessor system.